﻿#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QEvent>
#include <QMouseEvent>
#include <QPainter>
#include <QPaintEvent>
#include <QBrush>
#include <QDebug>
#include "Astar.h" // 包含A*算法头文件
#include "Jps.h" // 包含JPS算法头文件
#include "Apf.h" // 包含APF算法头文件
#include "Sfjps.h"
// 定义状态枚举类型
enum STATE {
    NOTHING = 0, // 无状态
    SETSTART,    // 设置起点状态
    SETEND,      // 设置终点状态
    SETBARRIER   // 设置障碍物状态
};

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; } // 定义UI命名空间
QT_END_NAMESPACE

// Widget类继承自QWidget
class Widget : public QWidget {
    Q_OBJECT

public:
    // 构造函数，参数parent表示父指针，默认为nullptr
    Widget(QWidget *parent = nullptr);
    // 析构函数
    ~Widget();

    Astar astar; // A*算法实例
    Jps jps; // JPS算法实例
    APF apf;
    Sfjps sfjps;//SFJPS算法实例

    int height;//地图高度
    double distance;//起始点直线距离
    double algorithm_distance;//算法计算距离

    STATE state; // 当前状态
    double dx, dy; // 窗口的宽度和高度

    // 鼠标按下事件处理函数
    void mousePressEvent(QMouseEvent *event);
    // 显示绘图函数
    void showPaint();
    // 事件过滤器
    bool eventFilter(QObject *watched, QEvent *event);

    // 重新开始函数
    void newstart();

private slots:
    // 重置按钮点击事件处理函数
    void on_pushButton_reset_clicked();

    // 设置起点按钮点击事件处理函数
    void on_pushButton_setstart_clicked();

    // 设置终点按钮点击事件处理函数
    void on_pushButton_setend_clicked();

    // 设置障碍物按钮点击事件处理函数
    void on_pushButton_setbarrier_clicked();

    // 行数输入框文本改变事件处理函数
    void on_lineEdit_rownum_textChanged(const QString &arg1);

    // 列数输入框文本改变事件处理函数
    void on_lineEdit_colnum_textChanged(const QString &arg1);

    // 确认按钮点击事件处理函数
    void on_pushButton_ok_clicked();

    // 开始按钮点击事件处理函数
    void on_pushButton_start_clicked();

    // 显示图像函数
    void showimage();

    // 灰度按钮点击事件处理函数
    void on_pushButton_gray_clicked();


private:
    Ui::Widget *ui; // UI指针
};

#endif // WIDGET_H
